/**
 * Note: The returned array must be malloced, assume caller calls free().
 */



// 理解：26个小写字符中有字符 在所有字符串里都出现的话，就输出，重复的也算。
// 输入：["bella","label","roller"]
// 输出：["e","l","l"]

#define MIN(A,B) ((A)<(B)? (A):(B)) 
char ** commonChars(char ** A, int ASize, int* returnSize){
    int i, hash[26] = {0};
    // 先统计每一个字符串中字符的出现次数
    int len = strlen(A[0]);
    for (i = 0; i < len; i++) {
        hash[A[0][i] - 'a']++;
    }

    for (i = 1; i < ASize; i++) {
        //统计A[i]中字符的出现次数
        int j, count[26] = {0};
        len = strlen(A[i]);
        for (j = 0; j < len; j++) {
            count[A[i][j] - 'a']++;
        }

        // hash[i]和count[i]中取最小次数
        // 当如此N次后，hash['b' - 'a']仍大于0，说明所有字符串中都包含有'b'
        for (j = 0; j < 26; j++) {
            hash[j] = MIN(hash[j], count[j]);
        }
    }

    // 统计完成后，转化结果
    int idx = 0, res_cnt = 0;
    for (i = 0; i < 26; i++) {
        res_cnt += hash[i];
    }
    char **res = malloc(sizeof(char *) * res_cnt);
    for (i = 0; i < 26; i++) {
        while (hash[i]) {
            res[idx] = malloc(sizeof(char) * (1+1));
            res[idx][0] = i + 'a';
            res[idx][1] = '\0';
            idx++;
            hash[i]--;
        }
    }
    *returnSize = res_cnt;
    return res;
}